package net

import (
	"errors"
	"io"
	"net"
)

//// 长度字段使用的字节数量
//const numOfLengthBytes = 8

// Serve 方法是服务端的第一版实现
// 实现功能为：将客户端传过来的数据 double 一下然后返回给客户端
func Serve(network, addr string) error {
	listener, err := net.Listen(network, addr)
	if err != nil {
		return err
	}
	for {
		conn, err := listener.Accept()
		if err != nil {
			return err
		}
		go func() {
			if er := handleConn(conn); er != nil {
				_ = conn.Close()
			}
		}()
	}
}

// handleConn 读取数据的量为死的（只读取8 个字节的数据）
func handleConn(conn net.Conn) error {
	for {
		bs := make([]byte, 8)
		_, err := conn.Read(bs)
		if errors.Is(err, net.ErrClosed) || err == io.EOF || errors.Is(err, io.ErrUnexpectedEOF) {
			return err
		}
		if err != nil {
			continue
		}
		res := handleMsg(bs)
		n, err := conn.Write(res)
		if n != len(res) {
			return errors.New("micro: 没写完数据")
		}
		if errors.Is(err, net.ErrClosed) || err == io.EOF || errors.Is(err, io.ErrUnexpectedEOF) {
			return err
		}
		if err != nil {
			continue
		}
	}

}

func handleMsg(req []byte) []byte {
	res := make([]byte, 2*len(req))
	copy(res[:len(req)], req)
	copy(res[len(req):], req)
	return res
}
